リッジ回帰(Ridge Regression)
Overview
リッジ回帰は、線形回帰手法の1つです。予測に用いられる式は、線形回帰(通常最小二乗法)のものと同じですが、過剰適合を回避するために正則化を用います。リッジ回帰で用いられる正則化は、L2正則化と呼ばれます。
Theory
正則化すると、係数(重み)が小さくなるので特徴量がどんな値であっても過剰適合しにくくなります。特に、L2正則化は、各係数をなるべくゼロに近づけることで、高い汎化性能を持ちます。(完全にゼロにはしない)
正則化項を追加した目的関数
$ J(\theta) = \frac{1}{2m}(\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\sum_{j=1}^{n}\theta_j^2)
正則化項を追加した勾配降下法の更新式
repeat until convergence: {
$ \theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta) = \theta_j - \alpha (\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} + \frac{\lambda}{m}\theta_j) $ for j:= 0...n
}
このように、リッジ回帰では、正則化項にL2ノルムを用います。L2ノルムとは、ベクトルのユークリッド距離を取って計算されるものです。
ユークリッド距離の数式
$ d = \sqrt{(b_1 - a_1)^2 + (b_2 - a_2)^2}
Coding(Regression)
extended bostonデータセットでモデルを構築・学習・評価する
code: Python
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
ridge = Ridge().fit(X_train, y_train)
print('Train set score: {:.2f}'.format(ridge.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(ridge.score(X_test, y_test)))
--------------------------------------------------------------------------
Train set score: 0.89
Test set score: 0.75
--------------------------------------------------------------------------
このように、テストセットに対するスコアは比較的高いです。また、リッジ回帰では、パラメータalphaを調整し(デフォルトは1.0)、正則化の強さを決めることができます。alphaを増やすと係数はよりゼロに近づき、正則化はより強くなります。
extended bostonデータセットでパラメータalphaを調整してモデルを構築・学習・評価・可視化して比較する
code: Python
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
ridge = Ridge().fit(X_train, y_train)
print('Train set score: {:.2f}'.format(ridge.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(ridge.score(X_test, y_test)))
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print('Train set score: {:.2f}'.format(ridge10.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(ridge10.score(X_test, y_test)))
ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
print('Train set score: {:.2f}'.format(ridge01.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(ridge01.score(X_test, y_test)))
# alphaパラメータのモデルへの影響を可視化
plt.plot(ridge.coef_, 's', label='Ridge alpha=1')
plt.plot(ridge10.coef_, '^', label='Ridge alpha=10')
plt.plot(ridge01.coef_, 'v', label='Ridge alpha=0.1')
plt.plot(lr.coef_, 'o', label='LinearRegression')
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')
plt.hlines(0, 0, len(lr.coef_))
plt.ylim(-25, 25)
plt.legend()
plt.show()
--------------------------------------------------------------------------
Train set score: 0.89
Test set score: 0.75
Train set score: 0.79
Test set score: 0.64
Train set score: 0.93
Test set score: 0.77
--------------------------------------------------------------------------
https://gyazo.com/ff1c9d5b53fbcaf521bda510765b60ac
このように、alpha=10(正則化が強い)のときは、係数が大体-3から3の間にあり、より係数がゼロに近くなっていることがわかります。
Summary
Merit
過剰適合しにくい
Parameters
alpha
デフォルトは1.0
大きくすると正則化が強くなる